home *** CD-ROM | disk | FTP | other *** search
- unit Mtform;
-
- { Assuming the following tables exists on CSHOWTO alias:
-
- CREATE TABLE PROGRAM (
- PROGRAM_ID INTEGER NOT NULL,
- NAME VARCHAR(30),
- VERSION VARCHAR(10),
- PRIMARY KEY (PROGRAM_ID)
- );
-
- CREATE TABLE KEYTABLE (
- TABLENAME CHAR(31) NOT NULL,
- NEXTKEY DOUBLE PRECISION,
- PRIMARY KEY (TABLENAME)
- );
-
- }
-
- interface
-
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables;
-
- type
- TMultiTransactionForm = class(TForm)
- MainDatabase: TDatabase;
- ProgramDataSource: TDataSource;
- ProgramTable: TTable;
- ProgramDBGrid: TDBGrid;
- ProgramDBNavigator: TDBNavigator;
- procedure FormCreate(Sender: TObject);
- procedure ProgramTableAfterPost(DataSet: TDataset);
- procedure ProgramTableAfterDelete(DataSet: TDataset);
- procedure ProgramTableAfterCancel(DataSet: TDataset);
- procedure ProgramTableBeforeInsert(DataSet: TDataset);
- procedure ProgramTableAfterInsert(DataSet: TDataset);
- procedure FormDestroy(Sender: TObject);
- private
- { Private declarations }
- KeyDatabase: TDatabase;
- NextProgramId: LongInt;
- public
- { Public declarations }
- end;
-
- var
- MultiTransactionForm: TMultiTransactionForm;
-
- implementation
-
- {$R *.DFM}
-
- procedure TMultiTransactionForm.FormCreate(Sender: TObject);
- begin
- try
- KeyDatabase := TDatabase.Create( Self );
- With KeyDatabase do
- begin
- AliasName := MainDatabase.AliasName;
- DatabaseName := 'TheKeyDatabase';
- KeepConnection := True;
- With Params do
- begin
- Clear;
- Add( 'USER NAME=sysdba' );
- Add( 'PASSWORD=masterkey' );
- end;
- LoginPrompt := False;
- Open;
- end;
- MainDatabase.StartTransaction;
- ProgramTable.Open;
- except
- on E: EDatabaseError do
- begin
- MessageBeep( $FFFF );
- Application.ShowException( E );
- Application.Terminate;
- end;
- end;
- end;
-
- procedure TMultiTransactionForm.ProgramTableAfterPost(DataSet: TDataset);
- begin
- MainDatabase.Commit;
- Refresh;
- MainDatabase.StartTransaction;
- end;
-
- procedure TMultiTransactionForm.ProgramTableAfterDelete(DataSet: TDataset);
- begin
- MainDatabase.Commit;
- MainDatabase.StartTransaction;
- end;
-
- procedure TMultiTransactionForm.ProgramTableAfterCancel(DataSet: TDataset);
- begin
- MainDatabase.Rollback;
- Refresh;
- MainDatabase.StartTransaction;
- end;
-
- procedure TMultiTransactionForm.ProgramTableBeforeInsert(
- DataSet: TDataset);
- var
- KeyQuery: TQuery;
- begin
- try
- KeyDatabase.StartTransaction;
- KeyQuery := TQuery.Create( Self );
- try
- with KeyQuery do
- begin
- DatabaseName := KeyDatabase.DatabaseName;
- UniDirectional := True;
- Close;
- with Sql do
- begin
- Clear;
- Add( 'SELECT NEXTKEY' );
- Add( 'FROM KEYTABLE' );
- Add( 'WHERE TABLENAME = ''' +
- ProgramTable.TableName +
- ''''
- );
- end;
- Open;
- if RecordCount <> 0 then
- begin
- NextProgramId := FieldByName( 'NEXTKEY' ).AsInteger;
- Close;
- with Sql do
- begin
- clear;
- Add( 'UPDATE KEYTABLE' );
- Add( 'SET NEXTKEY = NEXTKEY + 1' );
- Add( 'WHERE TABLENAME = ''' +
- ProgramTable.TableName +
- ''''
- );
- end;
- ExecSql;
- end
- else { RecordCount = 0 }
- begin
- { This is the very first time a record is inserted. }
- NextProgramId := 1;
- Close;
- with Sql do
- begin
- Clear;
- Add( 'INSERT INTO KEYTABLE ( TABLENAME, NEXTKEY )' );
- Add( 'VALUES ( ''' +
- ProgramTable.TableName +
- ''', 2 )'
- );
- end;
- ExecSql;
- end;
- end;
- finally
- KeyQuery.Free;
- end;
- KeyDatabase.Commit;
- except
- On E: EDatabaseError do
- begin
- KeyDatabase.Rollback;
- MessageBeep( $FFFF );
- E.Message := E.Message + '.' + chr(10) + chr(13) +
- 'Unable to generate new key';
- raise;
- end;
- end;
- end;
-
- procedure TMultiTransactionForm.ProgramTableAfterInsert(DataSet: TDataset);
- begin
- ProgramTable.FieldByName( 'PROGRAM_ID' ).AsInteger := NextProgramId;
- end;
-
- procedure TMultiTransactionForm.FormDestroy(Sender: TObject);
- begin
- ProgramTable.Close;
- MainDatabase.Commit;
- end;
-
- end.
-